Omakase RuboCop, Brakeman, Ruby 3.1+, allow_browser, rate_limit, and more | This Week in Rails
#This_Week_in_Rails
https://world.hey.com/this.week.in.rails/omakase-rubocop-brakeman-ruby-3-1-allow_browser-rate_limit-and-more-ff967a6d
気になったやつだけメモしよう
Default to creating GitHub CI files by dhh · Pull Request #50508 · rails/rails · GitHub
rails new すると、デフォルトでGitHub ActionsでCIを回すための設定ファイルがつくられるようになった
.github/workflows/ci.yml
--skip-ci オプションをつけると設定ファイルの生成をスキップできる
2024-01-01: あけおめ#6592dc544492e80000f6e1a4 でも言及してた
たしかXのPOSTで見かけたんだよな
Add rate limiting to Action Controller via the Kredis limiter type by dhh · Pull Request #50490 · rails/rails · GitHub
Railsに Kredis という gem が追加された
Kredis は Keyed Redis の略
from: https://github.com/rails/kredis
Kredis (Keyed Redis) encapsulates higher-level types and data structures around a single key, so you can interact with them as coherent objects rather than isolated procedural commands.
高レベルの型とデータ構造をカプセル化してくれる
Redisで扱えるデータ構造には限りがあって、Rubyのオブジェクトをそのまま扱うことは本来できない
ので、何らかの方法で変換をかますなどしてやりくりしている
この Kredis を使うと、そういった変換を上手にやってくれてRubyのオブジェクトのまま扱える
という認識をtanakenはしました
code:サンプルコード.rb
decimal = Kredis.decimal "mydecimal" # accuracy!
decimal.value = "%.47f" % (1.0 / 10)
# => SET mydecimal "0.10000000000000000555111512312578270211815834045"
BigDecimal("0.10000000000000000555111512312578270211815834045e0") == decimal.value
# => GET mydecimal
"mydecimal" という key で "%.47f" % (1.0 / 10) の計算結果を Redis に格納し、
Kredis.decimal("mydecimal").value で Redis からデータを取得すると同時に BigDecimal のオブジェクトに変換してくれている
で、この Kredis の limiter というタイプをつかって、コントローラーのレートリミットを実装できるようにしたよ、というのがこのプルリク
limiter について from: https://github.com/rails/kredis
code:サンプルコード.rb
limiter = Kredis.limiter "mylimit", limit: 3, expires_in: 5.seconds
0 == limiter.value # => GET "limiter"
limiter.poke # => SET limiter 0 NX + INCRBY limiter 1
limiter.poke # => SET limiter 0 NX + INCRBY limiter 1
limiter.poke # => SET limiter 0 NX + INCRBY limiter 1
false == limiter.exceeded? # => GET "limiter"
limiter.poke # => SET limiter 0 NX + INCRBY limiter 1
true == limiter.exceeded? # => GET "limiter"
sleep 6
limiter.poke # => SET limiter 0 NX + INCRBY limiter 1
limiter.poke # => SET limiter 0 NX + INCRBY limiter 1
limiter.poke # => SET limiter 0 NX + INCRBY limiter 1
false == limiter.exceeded? # => GET "limiter"
コントローラーでの実装例
code:サンプルコードを一部改行.rb
class SessionsController < ApplicationController
rate_limit to: 10, within: 3.minutes, only: :create
end
class SignupsController < ApplicationController
rate_limit to: 1000,
within: 10.seconds,
by: -> { request.domain },
with: -> { redirect_to busy_controller_url, alert: "Too many signups!" },
only: :new
end
Bump the required Ruby version to 3.1.0 by byroot · Pull Request #50491 · rails/rails · GitHub
このプルリクの説明によると、これまではRailsのメジャーバージョンアップのときに、EOLになったRubyのバージョンとの互換性を削除する、というポリシーだったらしい(そうなんだ)
この方針を変えたほうが良いという提案をしている
理由は次のとおり:
EOLになったRubyバージョンとの互換性を長期間維持しなければならない場合がある
Railsのメジャーバージョンアップの際に、複数のRubyバージョンとの互換性を一気に削除しなければならない場合がある
Rails ver N -> N + 1 の間に、複数のRubyバージョンがEOLを迎えた場合かな
とりあえず、Ruby 3.0は2024年3月にEOLになるし、Rails 7.2系が4月より前にリリースすることはなさそうだ(直近数ヶ月でリリースする予定はない)から、Ruby 3.0のサポートは切っちゃおうぜ、という話
ちなみに現時点での Rails の最新は v7.1.2 https://github.com/rails/rails/releases/tag/v7.1.2